home *** CD-ROM | disk | FTP | other *** search
/ Aminet 41 / Aminet 41 (2001)(Schatztruhe)[!][Feb 2001].iso / Aminet / dev / c / GSys.lha / gsys / gsystem / GFile.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-09-18  |  3.5 KB  |  211 lines

  1.  
  2. /* Author Anders Kjeldsen */
  3.  
  4. #ifndef GFILE_CPP
  5. #define GFILE_CPP
  6.  
  7. #include "gsystem/GFile.h"
  8. #include "gsystem/GObject.cpp"
  9.  
  10. GFile::GFile(GSTRPTR filename)
  11. {
  12.     memset((void *)this, 0, sizeof (class GFile) );
  13.  
  14.     if ( InitGObject("GFile") )
  15.     {
  16.         if (! FileOpen(filename) )
  17.         {
  18.             AddError("GFile", "Open() failed");
  19.         }
  20.     }
  21. }
  22.  
  23. GFile::~GFile()
  24. {
  25.     FileClose();
  26. }
  27.  
  28. BOOL GFile::FileOpen(GSTRPTR filename)
  29. {
  30.     if (FH) FileClose();
  31.  
  32. #ifdef GWINDOWS
  33.     DWORD FileSizeHigh = 0;
  34. #endif
  35.  
  36.     if (filename)
  37.     {
  38. #ifdef GAMIGA
  39.         FH = Open(filename, MODE_READWRITE);
  40.         if ( FH )
  41.         {
  42.             Seek(FH, 0, OFFSET_END);
  43.             FileSize = Seek(FH, 0, OFFSET_BEGINNING);
  44.             if ( strlen(filename) > 255 )
  45.             {
  46.                 Close(FH);
  47.                 FH = NULL;
  48.                 return FALSE;
  49.             }
  50.             else
  51.             {
  52.                 strcpy(FileName, filename);
  53.                 return TRUE;
  54.             }
  55.         }
  56. #endif
  57.  
  58. #ifdef GWINDOWS
  59.         if ( FH = CreateFile( filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, NULL, NULL) )
  60.         {
  61.             FileSize = GetFileSize(FH, &FileSizeHigh);
  62.             if (strlen(filename) > 255)
  63.             {
  64.                 CloseHandle(FH);
  65.                 return FALSE;
  66.             }
  67.             else 
  68.             {
  69.                 strcpy(FileName, filename);
  70.                 return TRUE;
  71.             }
  72.         }
  73. #endif
  74.  
  75.     }
  76.     return FALSE;
  77. }
  78.  
  79. BOOL GFile::FileClose()
  80. {
  81.     if (FH)
  82.     {
  83. #ifdef GAMIGA
  84.         Close(FH);
  85. #endif
  86. #ifdef GWINDOWS
  87.         CloseHandle(FH);
  88. #endif
  89.         FH = NULL;
  90.         *FileName = 0;
  91.         return TRUE;
  92.     }
  93.     return FALSE;
  94. }
  95.  
  96. BOOL GFile::FileLock() 
  97.     return FALSE;
  98.  
  99. BOOL GFile::FileUnLock() 
  100.     return TRUE;
  101.  
  102. BOOL GFile::FileSeek(GWORD offset, GUWORD seekmode)
  103. {
  104.     if (*FileName && FH)
  105.     {
  106.         GWORD temp = FilePtr;
  107.         if ( seekmode == GSEEK_START ) temp = 0;
  108.         else if ( seekmode == GSEEK_END ) temp = FileSize;
  109.  
  110.         temp += offset;
  111. #ifdef GAMIGA
  112.         if ( Seek(FH, temp, OFFSET_BEGINNING) != -1 )
  113. #endif
  114. #ifdef GWINDOWS
  115.         if ( SetFilePointer(FH, temp, NULL, FILE_BEGIN) != -1 )
  116. #endif
  117.         {
  118.             FilePtr = temp;
  119. //            WriteLog("Seek ok\n");
  120.             return TRUE;
  121.         }
  122.     }
  123.     return FALSE;
  124. }
  125.  
  126. BOOL GFile::FileRead(GAPTR buffer, GUWORD len)
  127. {
  128. #ifdef GWINDOWS
  129.     DWORD FileSizeHigh = 0;
  130. #endif
  131.     GWORD delta;
  132.     if (FH && buffer)
  133.     {
  134.         if (FileSize >= FilePtr)
  135.         {
  136.             delta = FileSize-(FilePtr+len);
  137.             if (delta < 0)
  138.             {
  139.                 len+= delta;
  140.             }
  141. #ifdef GAMIGA
  142.             Seek(FH, FilePtr, OFFSET_BEGINNING);
  143.             if ( Read(FH, buffer, len) )
  144.             {
  145.                 Seek(FH, FilePtr, OFFSET_BEGINNING);
  146.                 return TRUE;
  147.             }
  148.             else AddError("ReadError", "Read Failed");
  149. #endif
  150.  
  151. #ifdef GWINDOWS
  152.             SetFilePointer(FH, FilePtr, 0, FILE_BEGIN);
  153.             if ( ReadFile(FH, buffer, len, &FileSizeHigh, 0) )
  154.             {
  155.                 SetFilePointer(FH, FilePtr, 0, FILE_BEGIN);
  156.                 return TRUE;
  157.             }
  158. #endif
  159.         }
  160.         else AddError("WriteError", "FilePtr too big");
  161.     }
  162.     else AddError("WriteError", "No File");
  163.     Seek(FH, FilePtr, OFFSET_BEGINNING);
  164.     return FALSE;
  165. }
  166.  
  167. BOOL GFile::FileWrite(GAPTR buffer, GUWORD len)
  168. {
  169. #ifdef GWINDOWS
  170.     DWORD FileSizeHigh = 0;
  171. #endif
  172.  
  173.     if (FH && buffer)
  174.     {
  175.         if (FileSize >= FilePtr)
  176.         {
  177. #ifdef GAMIGA
  178.             Seek(FH, FilePtr, OFFSET_BEGINNING);
  179.             if ( Write(FH, buffer, len) )
  180.             {
  181.                 Seek(FH, 0, OFFSET_END);
  182.                 FileSize = Seek(FH, FilePtr, OFFSET_BEGINNING);
  183.                 return TRUE;
  184.             }
  185.             else AddError("WriteError", "Write Failed");
  186. #endif
  187.  
  188. #ifdef GWINDOWS
  189.             SetFilePointer(FH, FilePtr, 0, FILE_BEGIN);
  190.             if ( WriteFile(FH, buffer, len, &FileSizeHigh, 0) )
  191.             {
  192.                 SetFilePointer(FH, FilePtr, 0, FILE_BEGIN);
  193.                 FileSize = GetFileSize(FH, &FileSizeHigh);
  194.                 return TRUE;
  195.             }
  196. #endif
  197.         }
  198.         else AddError("WriteError", "FilePtr too big");
  199.     }
  200.     else AddError("WriteError", "No File");
  201.     Seek(FH, FilePtr, OFFSET_BEGINNING);
  202.     return FALSE;
  203. }
  204.  
  205. #endif /* GFILE_CPP */
  206.  
  207.